package com.vpclub.servlet;

import com.vpclub.filter.UserFilter;
import com.vpclub.listener.UserListener;
import com.vpclub.service.HelloService;

import javax.servlet.*;
import javax.servlet.annotation.HandlesTypes;
import java.util.EnumSet;
import java.util.Set;

/**
 * @author : leimingchao
 * @date Date : 2021年07月05日 21:40
 */

/**
 *容器启动的时候，会将@HandlesTypes指定的这个类型下面的子类（实现类，子接口等）传递过来,
 * 传入感兴趣的类型
 */
@HandlesTypes(value = {HelloService.class})
public class MyServletContainerInitializer implements ServletContainerInitializer {

    /**
     * 应用启动的时候，会运行onStartup方法
     *
     * ServletContext：代表当前web应用的ServletContext，一个web应用对应一个ServletContext
     *
     * Set<Class<?>> set：感兴趣的类型的所有子类型
     *
     * 1.使用ServletContext注册Web组件：Servlet，Filter，Listener
     * 2.使用编码的方式，在项目启动的时候给ServletContext里面添加组件
     *      必须在项目启动的时候添加：
     *          1.ServletContainerInitializer得到的ServletContext
     *          2.ServletContextListener得到的ServletContext
     *
     * @param set
     * @param servletContext
     * @throws ServletException
     */
    @Override
    public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {
        System.out.println("感兴趣的类型");
        set.stream().forEach(System.out::println);

        //注册组件
        ServletRegistration.Dynamic userServlet = servletContext.addServlet("userServlet", new UserServlet());
        //配置servlet的映射信息
        userServlet.addMapping("/user");


        //注册listener
        servletContext.addListener(UserListener.class);


        //注册filter
        FilterRegistration.Dynamic userFilter = servletContext.addFilter("userFilter", UserFilter.class);
        //配置Filter的映射信息
        userFilter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST),true,"/*");
    }
}
